/**
 * 
 */
package com.faxsun.core.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import mblog.core.pojos.Post;
import mtons.modules.pojos.Page;

import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;

import com.faxsun.core.pojos.enums.PostType;

/**
 * @author langhsu
 *
 */
public interface PostService {
	/**
	 * 分页查询所有文章
	 * @param page
	 */
	void paging(Page page, PostType type);
	
	/**
	 * 他人查询个人发布文章
	 * @param page
	 * @param userId
	 */
	void pagingByUserId(Page page, long userId);
	
	/**
	 * 按状态查询个人发布文章
	 * @param page
	 * @param userId
	 */
	void pagingByUserId(Page page, long userId,int status);
	
	/**
	 * 查询我的文章，不包含已删除
	 * @param page
	 * @param userId
	 */
	public void pagingByUserIdWithoutDeleted(Page page, long userId);
	
	/**
	 * 根据关键字搜索
	 * @param page
	 * @param q
	 * @return
	 * @throws InterruptedException
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	List<Post> search(Page page, String q) throws InterruptedException, IOException, InvalidTokenOffsetsException;
	
	/**
	 * 搜索 Tag
	 * @param page
	 * @param tag
	 * @return
	 * @throws InterruptedException
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	List<Post> searchByTag(Page page, String tag) throws InterruptedException, IOException, InvalidTokenOffsetsException;
	
	/**
	 * 查询最近更新
	 * @param maxResutls
	 * @param ignoreUserId
	 * @return
	 */
	List<Post> findRecents(int maxResutls, long ignoreUserId);
	
    /**
     * 查询最近更新的资讯数量
     * @param maxResutls
     * @param ignoreUserId
     * @return
     */
    int countRecentNews(int maxResutls, long ignoreUserId);
    
    /**
     * 查询最近更新的某类资讯数量
     * @param ignoreUserId
     * @param tags
     * @return
     */
    int countRecentNewsForTag(long ignoreUserId, List<String> tags);
	
	List<Post> findHots(int maxResutls, long ignoreUserId);
	
	/**
	 * 根据Ids查询
	 * @param ids
	 * @return
	 */
	Map<Long, Post> findByIds(Set<Long> ids);
	
	/**
	 * 发布文章
	 * @param post
	 */
	void post(Post post);
	
	/**
	 * 查询单个文章
	 * @param id
	 * @return
	 */
	Post get(long id);
	
	/**
	 * 删除
	 * @param id
	 */
	void delete(long id);
	
	/**
	 * 带作者验证的删除
	 * @param id
	 * @param authorId
	 */
	void delete(long id, long authorId);
	
	/**
	 * 恢复已删除的文章
	 * @param id 文章id
	 */
	void recover(long id);
	
	/**
	 * 自增浏览数
	 * @param id
	 */
	void identityViews(long id);
	
	/**
	 * 自增喜欢数
	 * @param id
	 */
	void identityHearts(long id);
	
	/**
	 * 自增评论数
	 * @param id
	 */
	void identityComments(long id);
	
	/**
	 * 自增评论数 step
	 * @param id
	 */
	void identityComments(long id, int step);
	
	/**
	 * 按状态分页查询所有文章
	 * @param page
	 */
	void pagingByStatus(Page page, PostType type, int status);
	
	/**
	 * 查找最近的文章
	 * @param page 页模型
	 * @param type 文章类型
	 */
	List<Post> findRecentPosts(Page page,PostType type);
}
